home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / FLTK-1.0.6 / src / fl_symbols.cxx < prev    next >
Encoding:
C/C++ Source or Header  |  1999-02-22  |  11.0 KB  |  388 lines

  1. //
  2. // "$Id: fl_symbols.cxx,v 1.8 1999/02/22 22:09:17 mike Exp $"
  3. //
  4. // Symbol drawing code for the Fast Light Tool Kit (FLTK).
  5. //
  6. // Copyright 1998-1999 by Bill Spitzak and others.
  7. //
  8. // This library is free software; you can redistribute it and/or
  9. // modify it under the terms of the GNU Library General Public
  10. // License as published by the Free Software Foundation; either
  11. // version 2 of the License, or (at your option) any later version.
  12. //
  13. // This library is distributed in the hope that it will be useful,
  14. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16. // Library General Public License for more details.
  17. //
  18. // You should have received a copy of the GNU Library General Public
  19. // License along with this library; if not, write to the Free Software
  20. // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  21. // USA.
  22. //
  23. // Please report all bugs and problems to "fltk-bugs@easysw.com".
  24. //
  25.  
  26. // These are small graphics drawn by the normal label-drawing
  27. // code when the string starts with an '@' sign.
  28.  
  29. // Adapted from original code written by:
  30.  
  31. // Written by Mark Overmars
  32. // Version 2.1 a
  33. // Date: Oct  2, 1992
  34.  
  35. #include <FL/Fl.H>
  36. #include <FL/fl_draw.H>
  37. #include <string.h>
  38.  
  39. typedef struct {
  40.   const char *name;
  41.   void (*drawit)(Fl_Color);
  42.   char scalable;
  43.   char notempty;
  44. } SYMBOL;
  45.  
  46. #define MAXSYMBOL       211
  47.    /* Maximal number of symbols in table. Only half of them are
  48.       used. Should be prime. */
  49.  
  50. static SYMBOL symbols[MAXSYMBOL];      /* The symbols */
  51. static int symbnumb = -1;              /* Their number */
  52.  
  53. static int find(const char *name) {
  54. // returns hash entry if it exists, or first empty slot:
  55.   int pos = name[0] ? (
  56.     name[1] ? (
  57.       name[2] ? 71*name[0]+31*name[1]+name[2] : 31*name[0]+name[1]
  58.     ) :
  59.       name[0]
  60.   ) : 0;
  61.   pos %= MAXSYMBOL;
  62.   int hh2 = name[0] ? (
  63.     (name[1]) ? 51*name[0]+3*name[1] : 3*name[0]
  64.     ) : 1;
  65.   hh2 %= MAXSYMBOL; if (!hh2) hh2 = 1;
  66.   for (;;) {
  67.     if (!symbols[pos].notempty) return pos;
  68.     if (!strcmp(symbols[pos].name,name)) return pos;
  69.     pos = (pos + hh2) % MAXSYMBOL;
  70.   }
  71. }
  72.  
  73. static void fl_init_symbols(void);
  74.  
  75. /**************** The routines seen by the user *************************/
  76.  
  77. int fl_add_symbol(const char *name, void (*drawit)(Fl_Color), int scalable)
  78. /* Adds a symbol to the system. Returns whether correct. */
  79. {
  80.   fl_init_symbols();
  81.   int pos;
  82.   if (symbnumb > MAXSYMBOL / 2) return 0;    // table is full
  83.   pos = find(name);
  84.   symbols[pos].name = name;
  85.   symbols[pos].drawit = drawit;
  86.   symbols[pos].notempty = 1;
  87.   symbols[pos].scalable = scalable;
  88.   symbnumb++;
  89.   return 1;
  90. }
  91.  
  92. int fl_return_arrow(int x,int y,int w,int h);
  93.  
  94. // provided for back compatability:
  95. int fl_draw_symbol(const char *label,int x,int y,int w,int h,Fl_Color col) {
  96.   const char *p = label;
  97.   if (*p++ != '@') return 0;
  98.   fl_init_symbols();
  99.   int equalscale = 0;
  100.   if (*p == '#') {equalscale = 1; p++;}
  101.   if (*p == '-' && p[1]>='1' && p[1]<='9') {
  102.     int n = p[1]-'0';
  103.     x += n; y += n; w -= 2*n; h -= 2*n;
  104.     p += 2;
  105.   } else if (*p == '+' && p[1]>='1' && p[1]<='9') {
  106.     int n = p[1]-'0';
  107.     x -= n; y -= n; w += 2*n; h += 2*n;
  108.     p += 2;
  109.   }
  110.   if (w < 10) {x -= (10-w)/2; w = 10;}
  111.   if (h < 10) {y -= (10-h)/2; h = 10;}
  112.   w = (w-1)|1; h = (h-1)|1;
  113.   int rotangle;
  114.   switch (*p++) {
  115.   case '0':
  116.     rotangle = 1000*(p[1]-'0') + 100*(p[2]-'0') + 10*(p[3]-'0');
  117.     p += 4;
  118.     break;
  119.   case '1': rotangle = 2250; break;
  120.   case '2': rotangle = 2700; break;
  121.   case '3': rotangle = 3150; break;
  122.   case '4': rotangle = 1800; break;
  123.   case '5':
  124.   case '6': rotangle = 0; break;
  125.   case '7': rotangle = 1350; break;
  126.   case '8': rotangle =  900; break;
  127.   case '9': rotangle =  450; break;
  128.   default: rotangle = 0; p--; break;
  129.   }
  130.   int pos = find(p);
  131.   if (!symbols[pos].notempty) return 0;
  132.   if (symbols[pos].scalable == 3) { // kludge to detect return arrow
  133.     fl_return_arrow(x,y,w,h);
  134.     return 1;
  135.   }
  136.   fl_push_matrix();
  137.   fl_translate(x+w/2,y+h/2);
  138.   if (symbols[pos].scalable) {
  139.     if (equalscale) {if (w<h) h = w; else w = h;}
  140.     fl_scale(0.5*w, 0.5*h);
  141.     fl_rotate(rotangle/10.0);
  142.   }
  143.   (symbols[pos].drawit)(col);
  144.   fl_pop_matrix();
  145.   return 1;
  146. }
  147.  
  148. /******************** THE DEFAULT SYMBOLS ****************************/
  149.  
  150. /* Some help stuff */
  151.  
  152. #define BP fl_begin_polygon()
  153. #define EP fl_end_polygon()
  154. #define BL fl_begin_line()
  155. #define EL fl_end_line()
  156. #define BC fl_begin_loop()
  157. #define EC fl_end_loop()
  158. #define vv(x,y) fl_vertex(x,y)
  159.  
  160. //for the outline color
  161. static void set_outline_color(Fl_Color c) {
  162.   fl_color(fl_color_average(c, FL_BLACK, .5));
  163. }
  164.  
  165. static void rectangle(double x,double y,double x2,double y2,Fl_Color col) {
  166.   fl_color(col);
  167.   BP; vv(x,y); vv(x2,y); vv(x2,y2); vv(x,y2); EP;
  168.   set_outline_color(col);
  169.   BC; vv(x,y); vv(x2,y); vv(x2,y2); vv(x,y2); EC;
  170. }
  171.  
  172. /* The drawing routines */
  173.  
  174. static void draw_arrow1(Fl_Color col)
  175. {
  176.   fl_color(col);
  177.   BP; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,-0.4); EP;
  178.   BP; vv(0.0,0.8); vv(0.8,0.0); vv(0.0,-0.8); vv(0.0,-0.4); vv(0.0,0.4); EP;
  179.   set_outline_color(col);
  180.   BC; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,0.8); vv(0.8,0.0);
  181.       vv(0.0,-0.8); vv(0.0,-0.4); EC;
  182. }
  183.  
  184. static void draw_arrow1bar(Fl_Color col)
  185. {
  186.   draw_arrow1(col);
  187.   rectangle(.6,-.8,.9,.8,col);
  188. }
  189.  
  190. static void draw_arrow2(Fl_Color col)
  191. {
  192.   fl_color(col);
  193.   BP; vv(-0.3,0.8); vv(0.50,0.0); vv(-0.3,-0.8); EP;
  194.   set_outline_color(col);
  195.   BC; vv(-0.3,0.8); vv(0.50,0.0); vv(-0.3,-0.8); EC;
  196. }
  197.  
  198. static void draw_arrow3(Fl_Color col)
  199. {
  200.   fl_color(col);
  201.   BP; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EP;
  202.   BP; vv(-0.7,0.8); vv(0.1,0.0); vv(-0.7,-0.8); EP;
  203.   set_outline_color(col);
  204.   BC; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EC;
  205.   BC; vv(-0.7,0.8); vv(0.1,0.0); vv(-0.7,-0.8); EC;
  206. }
  207.  
  208. static void draw_arrowbar(Fl_Color col)
  209. {
  210.   fl_color(col);
  211.   BP; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EP;
  212.   BP; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EP;
  213.   set_outline_color(col);
  214.   BC; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EC;
  215.   BC; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EC;
  216. }
  217.  
  218. static void draw_arrowbox(Fl_Color col)
  219. {
  220.   fl_color(col);
  221.   BP; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EP;
  222.   BC; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EC;
  223.   set_outline_color(col);
  224.   BC; vv(0.2,0.8); vv(0.6,0.8); vv(0.6,-0.8); vv(0.2,-0.8); EC;
  225.   BC; vv(-0.6,0.8); vv(0.2,0.0); vv(-0.6,-0.8); EC;
  226. }
  227.  
  228. static void draw_bararrow(Fl_Color col)
  229. {
  230.   fl_color(col);
  231.   BP; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EP;
  232.   BP; vv(-0.5,0.8); vv(-0.1,0.8); vv(-0.1,-0.8); vv(-0.5,-0.8); EP;
  233.   set_outline_color(col);
  234.   BC; vv(0.1,0.8); vv(0.9,0.0); vv(0.1,-0.8); EC;
  235.   BC; vv(-0.5,0.8); vv(-0.1,0.8); vv(-0.1,-0.8); vv(-0.5,-0.8); EC;
  236. }
  237.  
  238. static void draw_doublebar(Fl_Color col) { 
  239.   rectangle(-0.6,-0.8,-.1,.8,col);
  240.   rectangle(.1,-0.8,.6,.8,col); 
  241. }
  242.  
  243. static void draw_arrow01(Fl_Color col)
  244.   { fl_rotate(180); draw_arrow1(col); }
  245.  
  246. static void draw_arrow02(Fl_Color col)
  247.   { fl_rotate(180); draw_arrow2(col); }
  248.  
  249. static void draw_arrow03(Fl_Color col)
  250.   { fl_rotate(180); draw_arrow3(col); }
  251.  
  252. static void draw_0arrowbar(Fl_Color col)
  253.   { fl_rotate(180); draw_arrowbar(col); }
  254.  
  255. static void draw_0arrowbox(Fl_Color col)
  256.   { fl_rotate(180); draw_arrowbox(col); }
  257.  
  258. static void draw_0bararrow(Fl_Color col)
  259.   { fl_rotate(180); draw_bararrow(col); }
  260.  
  261. static void draw_doublearrow(Fl_Color col)
  262. {
  263.   fl_color(col);
  264.   BP; vv(-0.35,-0.4); vv(-0.35,0.4); vv(0.35,0.4); vv(0.35,-0.4); EP;
  265.   BP; vv(0.15,0.8); vv(0.95,0.0); vv(0.15,-0.8); EP;
  266.   BP; vv(-0.15,0.8); vv(-0.95,0.0); vv(-0.15,-0.8); EP;
  267.   set_outline_color(col);
  268.   BC; vv(-0.15,0.4); vv(0.15,0.4); vv(0.15,0.8); vv(0.95,0.0);
  269.       vv(0.15,-0.8); vv(0.15,-0.4); vv(-0.15,-0.4); vv(-0.15,-0.8);
  270.       vv(-0.95,0.0); vv(-0.15,0.8); EC;
  271. }
  272.  
  273. static void draw_arrow(Fl_Color col)
  274. {
  275.   fl_color(col);
  276.   BP; vv(0.65,0.1); vv(1.0,0.0); vv(0.65,-0.1); EP;
  277.   BL; vv(-1.0,0.0); vv(0.65,0.0); EL;
  278.   set_outline_color(col);
  279.   BL; vv(-1.0,0.0); vv(0.65,0.0); EL;
  280.   BC; vv(0.65,0.1); vv(1.0,0.0); vv(0.65,-0.1); EC;
  281. }
  282.  
  283. static void draw_square(Fl_Color col)
  284.   { rectangle(-1,-1,1,1,col); }
  285.  
  286. static void draw_circle(Fl_Color col) {
  287.   fl_color(col); BP; fl_circle(0,0,1); EP;
  288.   set_outline_color(col);
  289.   BC; fl_circle(0,0,1); EC;
  290. }
  291.  
  292. static void draw_line(Fl_Color col)
  293.   { fl_color(col); BL; vv(-1.0,0.0); vv(1.0,0.0); EL; }
  294.  
  295. static void draw_plus(Fl_Color col)
  296. {
  297.   fl_color(col);
  298.   BP; vv(-0.9,-0.15); vv(-0.9,0.15); vv(0.9,0.15); vv(0.9,-0.15); EP;
  299.   BP; vv(-0.15,-0.9); vv(-0.15,0.9); vv(0.15,0.9); vv(0.15,-0.9); EP;
  300.   set_outline_color(col);
  301.   BC;
  302.   vv(-0.9,-0.15); vv(-0.9,0.15); vv(-0.15,0.15); vv(-0.15,0.9);
  303.   vv(0.15,0.9); vv(0.15,0.15); vv(0.9,0.15); vv(0.9,-0.15);
  304.   vv(0.15,-0.15); vv(0.15,-0.9); vv(-0.15,-0.9); vv(-0.15,-0.15);
  305.   EC;
  306. }
  307.  
  308. static void draw_uparrow(Fl_Color) {
  309.   fl_color(FL_LIGHT3);
  310.   BL; vv(-.8,.8); vv(-.8,-.8); vv(.8,0); EL;
  311.   fl_color(FL_DARK3);
  312.   BL; vv(-.8,.8); vv(.8, 0); EL;
  313. }
  314.  
  315. static void draw_downarrow(Fl_Color) {
  316.   fl_color(FL_DARK3);
  317.   BL; vv(-.8,.8); vv(-.8,-.8); vv(.8,0); EL;
  318.   fl_color(FL_LIGHT3);
  319.   BL; vv(-.8,.8); vv(.8, 0); EL;
  320. }
  321.  
  322. static void draw_menu(Fl_Color col)
  323. {
  324.   rectangle(-0.65, 0.85, 0.65, -0.25, col);
  325.   rectangle(-0.65, -0.6, 0.65, -1.0, col);
  326. }
  327.  
  328. static void fl_init_symbols(void) {
  329.   static char beenhere;
  330.   if (beenhere) return;
  331.   beenhere = 1;
  332.   symbnumb = 0;
  333.  
  334.   fl_add_symbol("",        draw_arrow1,        1);
  335.   fl_add_symbol("->",        draw_arrow1,        1);
  336.   fl_add_symbol(">",        draw_arrow2,        1);
  337.   fl_add_symbol(">>",        draw_arrow3,        1);
  338.   fl_add_symbol(">|",        draw_arrowbar,        1);
  339.   fl_add_symbol(">[]",        draw_arrowbox,        1);
  340.   fl_add_symbol("|>",        draw_bararrow,        1);
  341.   fl_add_symbol("<-",        draw_arrow01,        1);
  342.   fl_add_symbol("<",        draw_arrow02,        1);
  343.   fl_add_symbol("<<",        draw_arrow03,        1);
  344.   fl_add_symbol("|<",        draw_0arrowbar,        1);
  345.   fl_add_symbol("[]<",        draw_0arrowbox,        1);
  346.   fl_add_symbol("<|",        draw_0bararrow,        1);
  347.   fl_add_symbol("<->",        draw_doublearrow,    1);
  348.   fl_add_symbol("-->",        draw_arrow,        1);
  349.   fl_add_symbol("+",        draw_plus,        1);
  350.   fl_add_symbol("->|",        draw_arrow1bar,        1);
  351.   fl_add_symbol("arrow",    draw_arrow,        1);
  352.   fl_add_symbol("returnarrow",    0,            3);
  353.   fl_add_symbol("square",    draw_square,        1);
  354.   fl_add_symbol("circle",    draw_circle,        1);
  355.   fl_add_symbol("line",        draw_line,        1);
  356.   fl_add_symbol("plus",        draw_plus,        1);
  357.   fl_add_symbol("menu",        draw_menu,        1);
  358.   fl_add_symbol("UpArrow",    draw_uparrow,        1);
  359.   fl_add_symbol("DnArrow",    draw_downarrow,        1);
  360.   fl_add_symbol("||",        draw_doublebar,        1);
  361. }
  362.  
  363. ////////////////////////////////////////////////////////////////
  364.  
  365. #include <FL/Fl_Widget.H>
  366.  
  367. // this is the labeltype function:
  368. extern void fl_normal_label(const Fl_Label*, int, int, int, int, Fl_Align);
  369. static void fl_symbol_label(
  370.     const Fl_Label* o, int x, int y, int w, int h, Fl_Align align)
  371. {
  372.   if (!fl_draw_symbol(o->value, x, y, w, h, (Fl_Color)o->color))
  373.     fl_normal_label(o, x, y, w, h, align);
  374. }
  375.  
  376. Fl_Labeltype define_FL_SYMBOL_LABEL() {
  377.   Fl::set_labeltype(_FL_SYMBOL_LABEL, fl_symbol_label, 0);
  378.   return _FL_SYMBOL_LABEL;
  379. }
  380.  
  381. void Fl::enable_symbols() {
  382.   Fl::set_labeltype(FL_NORMAL_LABEL, fl_symbol_label, 0);
  383. }
  384.  
  385. //
  386. // End of "$Id: fl_symbols.cxx,v 1.8 1999/02/22 22:09:17 mike Exp $".
  387. //
  388.